 <?php

    
    define('LOGIC_PATH', str_replace( '\\', '/', __DIR__.'/logic')); 
    require_once 'vendor/autoload.php';
    use think\facade\Db;
    // 数据库配置信息设置（全局有效）
    Db::setConfig([
        // 默认数据连接标识
        'default'     => 'mongo',
        // 数据库连接信息
        'connections' => [
            'mongo' => [
                // 数据库类型
                'type'     => 'mongo',
                // 主机地址
                'hostname' => '127.0.0.1',
                'hostport'  =>27017,
                // // 用户名
                // 'username' => 'root',
                // // 数据库名
                'database' => 'template_im',
                // // 数据库编码默认采用utf8
                // 'charset'  => 'utf8',
                // // 数据库表前缀
                // 'prefix'   => '',
                // // 数据库调试模式
                // 'debug'    => true,
            ],
        ],
    ]); 
     spl_autoload_register(function ($className) {
        $classPath = LOGIC_PATH .'/'. $className . ".php"; 
        if (is_file($classPath) && !in_array('think',explode('\\',$className))) {
            require_once "{$classPath}";
        }
    });
//     use think\facade\Db;
//     // 数据库配置信息设置（全局有效）
//     Db::setConfig([
//         // 默认数据连接标识
//         'default'     => 'mongo',
//         // 数据库连接信息
//         'connections' => [
//             'mongo' => [
//                 // 数据库类型
//                 'type'     => 'mongo',
//                 // 主机地址
//                 'hostname' => '127.0.0.1',
//                 'hostport'  =>27017,
//                 // // 用户名
//                 // 'username' => 'root',
//                 // // 数据库名
//                 'database' => 'template_im',
//                 // // 数据库编码默认采用utf8
//                 // 'charset'  => 'utf8',
//                 // // 数据库表前缀
//                 // 'prefix'   => '',
//                 // // 数据库调试模式
//                 // 'debug'    => true,
//             ],
//         ],
//     ]); 
//  class im{
//     public $ws = '';
//     protected static $redis = '';
    
//     public function __construct(){
//         self::$redis = new Redis();
//         self::$redis->connect('127.0.0.1', 6379);
//         $this->ws = new swoole_websocket_server("0.0.0.0", 9501,SWOOLE_PROCESS,SWOOLE_SOCK_TCP | SWOOLE_SSL);
//         $this->ws->set(
//             [
//                  'ssl_key_file' => __DIR__.'/key/4297766_swoole.mveris.cn.key',
//                 'ssl_cert_file' => __DIR__.'/key/4297766_swoole.mveris.cn.pem', 
//             ]
//         );
//         $this->onOpen();
        
//         $this->onMessage();
        
        
//         $this->onClose();
        
//         $this->ws->start();
        
//     }
//     public function onMessage(){
        
//           //监听WebSocket消息事件
//         $this->ws->on('message', function (\Swoole\WebSocket\Server $ws, $frame) {
//             $param = (array)(json_decode($frame->data)); 
             
//             $fd = $frame->fd;
//             switch($param['act']){
//                 case 'userLogin':
//                     $userLogin = new userLogin();
//                     $info = $userLogin->TODO($frame,$fd);
//                     $ws->push($fd,json_encode($info) );
//                 break;
//                  case 'userRegister':
//                      $userRegister = new userRegister();
//                     $info = $userRegister->TODO($frame,$fd);
//                     $ws->push($fd,json_encode($info));
//                 break; 
//                 case 'confirmAdd':
//                     $confirmAdd = new confirmAdd();
//                     $info = $confirmAdd->TODO($ws,$frame,$fd,$ws);
//                     $ws->push($fd,json_encode($info) );
//                 break;
//                 case 'searchContacts':
//                     $searchContacts = new searchContacts();
//                     $info = $searchContacts->TODO($frame,$fd);
//                     $ws->push($fd,json_encode($info) );
//                 break;
//                 case 'completeRecord':
//                     $completeRecord = new completeRecord();
//                     $info = $completeRecord->TODO($frame,$fd);
//                     $ws->push($fd,json_encode($info) );
//                 break;
//                 case 'Auditors':
//                     $Auditors = new Auditors();
//                     $info = $Auditors->TODO($ws,$frame,$fd);
//                     $ws->push($fd,json_encode($info) );
//                 break;
//                 case 'chatLine':
//                     $chatLine = new chatLine();
//                     $info = $chatLine->TODO($frame,$fd);
//                     $ws->push($info['fd'],json_encode($info) );
//                 break;
//                 case 'faceToChat':
//                     $faceToChat = new faceToChat();
//                     $info = $faceToChat->TODO($frame,$fd);
//                     $ws->push($info['fd'],json_encode($info) );
//                 break;
//                 case 'getChatLog':
//                     $getChatLog = new getChatLog();
//                     $info = $getChatLog->TODO($frame,$fd);
//                     $ws->push($fd,json_encode($info) );
//                 break;
 
                    
//             }
//         });
      
       
//     }
//     public function onOpen(){
//               //监听WebSocket连接打开事件
//       $this->ws->on('open', function (\Swoole\WebSocket\Server $ws, $request) {  
//             self::$redis->sAdd("userLogin", $request->fd); 
//             $this->ws->push($request->fd, json_encode(['act'=>'open','status'=>1])); 
//         });
        

//     }
//     public function onClose(){
        
//                 //监听WebSocket连接关闭事件
//         $this->ws->on('close', function (\Swoole\WebSocket\Server $ws, $fd) {
//             Db::name('user')->where('fd',$fd)->update(['fd'=>'']);
//             self::$redis->sRem("userLogin",$fd);
//             echo "client-{$fd} is closed\n";
//         });
//     }
//     // 注册
//     public  function userRegister($frame,$fd){
        
//         $param = (array)json_decode($frame->data); 
//         $data = [
//             'pass'  =>   md5($param['passwd']), 
//             'uuid'  =>   uuid_create(1),  
//             'tokenId'   => self::createToken(),
//             'expireTime'   => time(), 
//             'fd'        =>  $fd,
//             'username' => $param['username']
//         ];
 
 
//         $isEmpty = Db::name('user')->where('username',$param['username'])->find();
//         // $db->query($collname, $filter, $queryWriteOps)->toArray(); 
        
//         if(!$isEmpty){
//             $rs = Db::name('user')->insert($data);
//             if($rs){
//                 $return = [
//                     'status'=>0,
//                     'msg'=>'注册成功,请进行登录',
//                     'data'=>'', 
//                     'act'=>'userRegister',
//                     'fd'=>$fd,
//                 ];
//             }else{
//               $return = [
//                 'status'=>0,
//                 'msg'=>'注册失败',
//                 'data'=>'',
//                 'act'=>''
//                 ]; 
//             }
//         }else{
//             $return = [
//                 'status'=>0,
//                 'msg'=>'该账户已存在',
//                 'data'=>'', 
//                 ];
//         }
//         return $return;
//     }
//     // 登录
//     public  function userLogin($frame,$fd){ 
//         $param = (array)(json_decode($frame->data));  
        
       
//         $isEmpty = Db::name('user')->where('username',$param['username'])->find();
        
//         if($isEmpty && md5($param['passwd']) == $isEmpty['pass']){
//             if(!empty($isEmpty['fd'])){
//                 $this->ws->push($isEmpty['fd'],json_encode(['status'=>1,'msg'=>'您的账号已在其他设备登陆','act'=>'loginOut']));
//             }
//             $userData = [ 
//                 'expireTime'   => time()+10*60*60, 
//                 'fd'        =>  $fd,
//             ];
//             $result = Db::name('user')->where("username",$param['username'])->update($userData); 
        
//             $userFriend =  Db::name('friend')->where("memberTo",$param['username'])->order('fd desc')->select()->toArray();   
//             foreach($userFriend as $k =>$v){  
//                 $userFriend[$k]['msgCount'] =   Db::name('chatlog')
//                                                 ->where("toMember",$param['username'])
//                                                 ->where("memberTo",$v['toMember'])
//                                                 ->where("isRead",0)
//                                                 ->count();
//             }   
//         if($isEmpty){
//                 return [
//                     'status'=>1,
//                     'msg'=>'登录成功',
//                     'data'=>['fd'=>$fd,'expireTime'=>time()+10*60*60,'uuid'=>$isEmpty['uuid'],'username'=>$param['username'],'allFriend'=>$userFriend], 
//                     'act'=>'userLogin',
//                     'fd'=>$fd,
//                 ];
//             }else{
//                 return [
//                     'status'=>0,
//                     'msg'=>'账号或密码错误!',
//                     'data'=>'', 
//                 ];
//             }
//         }else{
//             return [
//                 'status'=>0,
//                 'msg'=>'账号或密码错误',
//                 'data'=>'', 
//             ];
//         }
//     }
//     // 搜索好友
//     public  function searchContacts($frame,$fd){
//         $param = (array)json_decode($frame->data); 
 
//         $isEmpty = Db::name('user')->field('username,uuid,fd')->where("username",$param['toUsername'])->find(); 
//         if($isEmpty && ($param['toUsername'] != $param['usernameTo'] )){ 
//              $return = [
//                 'status'=>1,
//                 'msg'=>'查到该用户',
//                 'data'=>$isEmpty, 
//                 'act'=>'searchContacts',
//                 'fd'=>$fd,
//             ];
//         }else{
//             $return = [
//                 'status'=>0,
//                 'msg'=>'该账户不存在',
//                 'data'=>'', 
//                 ];
//         }
//         return $return;
//     }
//     // 确认添加好友
//     public  function confirmAdd($frame,$fd){
//         $param = (array)json_decode($frame->data); 
 
//         $isEmpty = Db::name('user')->where("uuid",$param['toMember'])->find(); 
         
//         if(!empty($isEmpty)){ 
//             $isFriend = Db::name('friend')->where("toMember",$param['memberTo'])->where("memberTo",$param['memberTo'])->find();  
//             if($isFriend){
//                 $return = [
//                     'status'=>0,
//                     'msg'=>'您已是该用户好友，无需申请',
//                     'act'=>'confirmAdd',
//                     'fd'=>$fd,
//                 ];
//             }else{
//                 $isApply = Db::name('friend_apply')
                
//                             ->where('status',0)
                            
//                             ->where('memberTo',$param['memberTo'])
                            
//                             ->where("toMember",$isEmpty['username'])
                            
//                             ->find();    
//                 if($isApply){
//                       $return = [
//                         'status'=>1,
//                         'msg'=>'已有申请，请勿重复申请',
//                         'data'=>'', 
//                         'act'=>'confirmAdd',
//                         'fd'=>$fd,
//                     ];
//                 }else{
//                     $collname = 'friend_apply';
                    
//                     $data = [
//                             "toMember"      =>  $isEmpty['username'],
//                             "memberTo"      =>  $param['memberTo'],
//                             "create_time"   =>  time(),
//                             "status"        =>  0,
//                             "to_uuid"       =>  $isEmpty['uuid'],
//                             "uuid_to"       =>  $param['uuid']
//                         ];  
//                     $isApply =  Db::name('friend_apply')->insert($data); 
//                     if($isEmpty['fd'] !=''){
//                         $data = [
//                             'status'=>1,
//                             'msg'=>'您有好友添加，请查看申请记录',
//                             'data'=>$data, 
//                             'act'=>'NewApply',
//                             'fd'=>$isEmpty['fd'],
//                         ];
//                         $this->ws->push($isEmpty['fd'],json_encode($data));
//                     }
//                     $return = [
//                         'status'=>1,
//                         'msg'=>'已提交申请，请等待回复',
//                         'data'=>$isApply, 
//                         'act'=>'confirmAdd',
//                         'fd'=>$fd,
//                     ];
                    
//                 }
//             }
             
//         }else{
//             $return = [
//                 'status'=>0,
//                 'msg'=>'该账户不存在',
//                 'data'=>'', 
//                 ];
//         }
//         return $return;
//     }
//     // 同意申请审核
//     public  function Auditors($frame,$fd){
//         $param = (array)json_decode($frame->data); 
         
//         $filter = [
//             '_id'  => $param['_id'], 
//         ]; 
//         $info = Db::name('friend_apply')->where('status',0)->where($filter)->find();
  
//         if($param['opertion'] == true){
//             $result =   Db::name('friend_apply')
        
//                     ->where($filter)
                    
//                     ->update(['status'=>1]); 
//              $data = [
//                     [
//                         "toMember"  => $info['toMember'],
//                         'insertTime' =>time(),
//                         "memberTo"  => $info['memberTo'],
//                         "to_uuid"   => $info['to_uuid'],
//                     ],
//                     [
//                         "toMember"  => $info['memberTo'], 
//                         'insertTime' =>time(),
//                         "memberTo"  => $info['toMember'],
//                         "to_uuid"   => $info['uuid_to'],
//                     ]
                    
//                 ];
        
                
//             $isInsert = Db::name('friend')->insertAll($data);  
//         }else{
//             $result =   Db::name('friend_apply')
        
//                         ->where($filter)
                        
//                         ->update(['status'=>0]); 
//             $isInsert = true;
//         }
      
        
                    
//         if($result && $isInsert){
//             $memberTo = [
                        
//                         "toMember"  => $info['memberTo'], 
//                         'insertTime' =>time(),
//                         "memberTo"  => $info['toMember'],
//                         "to_uuid"   => $info['uuid_to'],
//                         'msgCount' => 0,
//                         '_id'=>$info['_id'],
//                         'boolValue'=>$param['opertion'],
//                         'object'=>$param['opertion']
//                     ]; 
//             $return = [
//                 'status'=>1,
//                 'msg'=>'申请处理完毕',
                
//                 'friendData'=>$memberTo,
//                 'act' => 'Auditors'
//             ];
//             $toMember= [
//                         "toMember"  => $info['toMember'],
//                         'insertTime' =>time(),
//                         "memberTo"  => $info['memberTo'],
//                         "to_uuid"   => $info['to_uuid'],
//                         'msgCount' => 0
//                     ];
//                     var_dump($toMember);
//                     var_dump("---------------");
//                     var_dump($memberTo);
                    
//             $rs = Db::name('user')->where('username',$info['memberTo'])->find(); 
//             if(!empty($rs['fd'])){
//                 var_dump($rs['fd']);
//                 $returns = [
//                     'status'=>1,
//                     'msg'=>$info['toMember'].'已通过你的添加申请',
//                     'data'=>$toMember, 
//                     'act' => 'ToPushAuditors'
//                 ];
//                 $this->ws->push($rs['fd'],json_encode($returns));
//             } 
                
                 
//         }else{
//             $return = [
//                 'status'=>0,
//                 'msg'=>'申请处理失败',
//                 'data'=>'', 
//                 'act' =>'Auditors'
                
//                 ];
//         }
//         return $return;
//     }
//     // 申请记录
//     public  function completeRecord($frame,$fd){
//         $param = (array)json_decode($frame->data); 
//         $filter = [
//             "toMember"  => $param['toMember'],
//             "status"    => 0, 
//         ]; 
//         $isEmpty =  Db::name('friend_apply')
//                     ->where('toMember',$param['toMember'])
//                     ->where('status',0) 
//                     ->order('create_time desc')
//                     ->select();      
//         if($isEmpty){
//              $return = [
//                 'status'=>1,
//                 'msg'=>'申请列表已加载',
//                 'data'=>$isEmpty, 
//                 'act' => 'completeRecord'
//                 ];
//         }else{
//             $return = [
//                 'status'=>0,
//                 'msg'=>'暂未有可处理消息',
//                 'data'=>'', 
//                 'act' =>'completeRecord'
//                 ];
//         }
//         return $return;
//     }
//     // 点击头像进入聊天
//     public  function chatLine($frame,$fd){
//         $param = (array)json_decode($frame->data);  
//         $info = Db::name('user')->where('uuid',$param['to_uuid'])->find(); 
//         $to_uuid = $param['to_uuid'];
//         $content = $param['content'];
//         $data = [
//                 'to_uuid' =>  $param['to_uuid'],
//                 'content' => $param['content'],
//                 "toMember"  => $info['username'],
//                 "memberTo"  => $param['memberTo'],
//                 "uuid_to"   =>$param['uuid_to'],
//                 'sendTime'  =>time(),
//                 'isRead' =>0,
//             ];
//         $rs = Db::name('chatlog')->insert($data);
//         if($rs){
//              $return = [
//                 'status'=>1,
//                 'msg'=>'消息记录已加载',
//                 'data'=>[['to_uuid'=>$param['to_uuid'],'uuid_to'=>$param['uuid_to'],'content'=>$param['content']]], 
//                 'act' => 'getMsg',
//                 'fd'  =>$info['fd'],
//                 ];
//         }else{
//             $return = [
//                 'status'=>0,
//                 'msg'=>'发送失败',
//                 'data'=>'', 
//                 'act' =>'getMsg'
//                 ];
//         } 
//         return $return;
//     } 
//     public  function getChatLog($frame,$fd){
//         $param = (array)json_decode($frame->data);  
//         $map1 = [
//                 ["uuid_to",'=',$param['uuid_to']],
//                 ["to_uuid",'=',$param['to_uuid']],
            
//             ]; 
//         $map2 = [
//             ["uuid_to",'=',$param['to_uuid']],
//             ["to_uuid",'=',$param['uuid_to']],
//             ];  
//         Db::name('chatlog')->where($map2)->update(['isRead'=>1]);
//         $info = Db::name('chatlog')->whereOr($map1)->whereOr($map2)->order("sendTime asc")->select();  
//         if($info){
//              $return = [
//                 'status'=>1,
//                 'msg'=>'消息记录已加载',
//                 'data'=>$info, 
//                 'act' => 'getChatLog',
//                 'fd'  =>$info['fd'],
//                 ];
//         }else{
//             $return = [
//                 'status'=>0,
//                 'msg'=>'暂无相关记录',
//                 'data'=>'', 
//                 'act' =>'getChatLog'
//                 ];
//         } 
//         return $return;
//     } 
//     // 发送聊天记录
//     public  function sendPacket($frame,$fd){
//         $param = (array)json_decode($frame->data); 
          
//         $filter = [
//             "toMember"  => $param['toMember'],
//             "memberTo"  => $param['memberTo'],
//             'content'      => $param['chatMessage'],
//             'sendTime'  =>time(),
//             'isRead' =>0,
//         ];  
//         $isEmpty = Db::name('chatlog')->insert($filter);
//         if($isEmpty){
//              $return = [
//                 'status'=>1,
//                 'msg'=>'消息记录已发送',
//                 'data'=>$isEmpty, 
//                 'act' => 'getPacket'
//                 ];
//         }else{
//             $return = [
//                 'status'=>0,
//                 'msg'=>'暂未有可处理消息',
//                 'data'=>'', 
//                 'act' =>'getPacket'
//                 ];
//         }
//         return $return;
//     }
//     public function faceToChat($frame,$fd){
//         $param = (array)json_decode($frame->data); 
//         $rs = Db::name('user')->where('uuid',$param['to_uuid'])->find();
//         if($rs['fd'] == ''){
//              $this->ws->push($fd,json_encode(['status'=>0,'msg'=>'对方不在线，连接失败']) );
//         }else{
//             $filter = [
//                 "to_uuid"  => $param['to_uuid'],
//                 "uuid_to"  => $param['uuid_to'], 
//             ];
//             $toPush = [
//                     'status'=>1,
//                     'msg'=>'消息记录已发送',
//                     'data'=>$filter, 
//                     'act' => 'getFaceToCall'
//                     ];
//             $this->ws->push($rs['fd'],json_encode($toPush) );
//             $pushTo = [
//                 'status'=>1,
//                 'msg'=>'消息记录已发送',
//                 'data'=>$filter, 
//                 'act' => 'faceToChat'
//                 ];
//             $this->ws->push($fd,json_encode($pushTo) );
//             $filter = [
//                 "to_uuid"  => $param['to_uuid'],
//                 "uuid_to"  => $param['uuid_to'], 
//             ];
            
//         }
         
//     }
 

    
// } 

// Db::table('user')->where(function ($query) use($name, $id) {
//     $query->where('name', $name)
//         ->whereOr('id', '>', $id);
// })->select();to_uuid: "518ce924-d25f-11ea-a083-00163e034297"
// uuid_to: "882b7700-d3e2-11ea-b778-00163e034297"
// Db::name('friend')->delete(true);
// Db::name('chatlog')->delete(true);
// Db::name('user')->delete(true);
// Db::name('friend_apply')->delete(true);
// var_dump(Db::name('chatlog')->where("toMember",'aa')
//                                                     ->where("memberTo",'22')
//                                                     ->where("isRead",0)
//                                                     ->count());
 
new im();
